//ts 出现的目的就是为了代码的安全

//联合类型 默认就是并集的关系
let strOrNumber:number | string;//并集关系 如果联合类型不赋予任何类型 那么他只能调用类型中间的公共方法
//strOrNumber.toString();//注意一般情况下 联合类型都需要赋值后使用
strOrNumber = 123;
strOrNumber.toFixed(2);
strOrNumber = 'abc';
strOrNumber.split('')

//!标识非空断言 一定不为空 如果出现为空的情况 自行承担
let ele:HTMLElement | null  = document.getElementById('app');

ele!.style.color = 'red';
//? es10的语法 链的可选语法 js的语法 用来取值的 下面两个都是js语法 ? ||
ele?.style?.color//标识ele有值才取style属性
console.log(undefined ?? 2);//2 过滤调undefined 返回2
console.log(false??2);// false 过滤前一个不是null或者undefined 如果是null/undefined则返回后面的而结果

//类型断言来处理为空的情况 as 语法
(ele as HTMLElement).style.color = 'red';//你就是HTMLElement类型 强制断言
(<HTMLElement>ele).style.color = 'red';//可能和jsx冲突 jsx也有<>
let sn:number|string;
(sn! as number).toFixed(2);//断言只能用于断言存在的类型

//强制转之前定义不存在的类型
sn! as any as string;//双重断言 一般不建议使用，会破坏数据的原有类型


//字面量类型 类似枚举（固定的值） 通过type关键字自定义类型（非常像枚举）
type COLOR = 'red'|'yellow'|'blue';
let color: COLOR = 'red';

//联合类型 非空 强转 字面量类型



//会检测模块中的变量是否重名
export {}


//断言已经存在的类型：有双重类型 但是不建议使用as
//字面量类型
//type COLOR = 'red'|'yellow'|'blue'